\chapter{Description de l'interface graphique}
Dans cette section, l'interface graphique sera décrite de façon à exhiber son mécanisme de fonctionnement.\\
L'interface graphique a été implémenté en Java avec la bibliothèque graphique Swing. Cette bibliothèque est multiplateforme et indépendante du système d'exploitation qui l'utilise. Ainsi l'interface graphique du logiciel ne limite pas sa portabilité. De plus, la bibliothèque offre une facilité dans la manipulation de l'apparence de l'interface. En ce qui concerne la performance, la bibliothèque Swing est réputé pour être très efficace pour l'affichage d'un nombre limité de données comme c'est le cas dans notre logiciel.\\
La figure suivante donne un aperçu de l'interface du programme:
\begin{figure}[H]
\includegraphics[width=1\textwidth]{../images/apercu.png} 
\caption{Aperçu de l'interface}
\end{figure}
Pour expliquer le mécanisme derrière le fonctionnement de cette interface, la figure suivante présente ses composants.
\begin{figure}[H]
\includegraphics[width=1\textwidth]{../images/mecanisme.png} 
\caption{Mécanisme de l'interface}
\end{figure}
Comme le montre la figure, chaque composant de l'interface est contenu dans un autre. La "MainInterface" englobe le tout. Chaque composant est implémenté par une classe. La relation "\textit{un composant A contient un composant B}" se traduit par "\textit{une classe A délègue une classe B}". Le diagramme de classe suivant traduit la figure précédente :
\begin{figure}[H]
\includegraphics[width=1\textwidth]{../images/MCQReaderInterface.jpg} 
\caption{Classes implémentant l'interface}
\end{figure}
L'ensemble des classes figurant sur le diagramme ci-dessus est contenu dans le paquetage  \texttt{MCQReaderInterface}. Le but de ce diagramme est de montrer la relation qu'il y a entre contenue et délégation. Ainsi, la figure ne montre pas toutes les méthodes et tous les attributs des classes.\\
\section{Mécanisme de l'interface}
\subsection*{Interaction entre les composants}
Soit la relation :
\begin{center}
\textit{un composant A contient un composant B}\\
 $\Updownarrow$\\
\textit{une classe A délègue une classe B}\\
\end{center}
Elle implique que la classe A peut accéder aux attributs et méthodes de B. Cependant, la classe B ne peut accéder à ceux de la classe A. Une question se pose : pourquoi vouloir accéder aux attributs et méthodes de A à partir de B? Pour répondre cette question, soit l'exemple suivant :\\
\begin{itemize}
\item Un composant F : fenêtre principale.
\item Un composant I : interrupteur contenu dans F.
\item Un composant A : ampoule contenu dans F.
\end{itemize}
A l'appui sur l'interrupteur, l'ampoule s'allume si elle est éteinte et s'éteint si elle est allumée. F peut accéder aux attributs et méthodes de I et A. I a besoin d'accéder à ceux de F pour pouvoir atteindre A.\\
Plus concrètement, dans notre interface, il existe plein de situations équivalentes ou plus complexes :\\
\begin{itemize}
\item A l'appuie du  bouton ``next'' qui est contenu dans  le paquetage \texttt{MCQReaderNavigator} qui est  lui même contenu dans \texttt{MCQReaderPDF}, un message est envoyé à \texttt{MCQReaderDisplay} qui est contenu dans \texttt{MCQReaderGroupe} qui lui même est contenu dans \texttt{MCQReaderPDF}.
\item Au passage de la souris sur \texttt{MCQReaderLayer} qui est contenu dans \texttt{MCQReaderGroupe}, \texttt{MCQReaderPDF} et puis \texttt{MainInterface}, un message est envoyé à \texttt{MCQReaderInformation} qui est contenu dans \texttt{MCQReaderTool} qui lui même est contenu dans \texttt{MainInterface}.
\item ...
\end{itemize}
Il faut donc pouvoir accéder aux attributs et méthodes d'un composant depuis tout autre composant. Pour cela, plusieurs solutions sont possibles :
\begin{itemize}
\item La double délégation : A délègue B et B délègue A. Ainsi, il existera toujours un chemin à partir d'un composant vers tous les autres. L'inconvénient de cette méthode est le fait que la structure hiérarchique de l'interface devient moins explicite. De plus, le nombre de pointeur est doublé.
\item La fenêtre principale (\texttt{MainInterface}) contient des pointeurs vers tous les composants : cette méthode est meilleure que la précédente par rapport au temps d'accès à un composant depuis un autre. En effet, l'accès se fait en  temps constant. Cependant, à chaque ajout de composant, il sera nécessaire d'ajouter ses accesseurs dans la fenêtre principale.
\item Un pointeur static vers la fenêtre principale : ainsi tous les composants peuvent accéder à tous les autres. L'accès se fait au maximum en $O(log(n))$ avec $n$  le nombre de composants total. Un ajout d'un composant n'implique pas de modification dans l'implémentation de la fenêtre principale. La visibilité du pointeur doit être limité aux classes du paquetage.
\end{itemize}
La troisième solution est celle qui a été choisie pour les avantages qu'elle présente.
\subsection*{Rôles des classes}
\begin{itemize}
\item \texttt{MainInterface}: est la fenêtre principale du logiciel. Elle contient le pointeur static \texttt{\textit{thisIsIt}} qui permet à tous les composants d'être  relié entre eux. A l'instanciation d'un objet de cette classe, \texttt{MainInterface} instancie à son tour les trois composants qu'elle contient. Ainsi, chaque composant instancie les composants qu'il contient sauf \texttt{MCQReaderGroup} et \texttt{MCQReaderTree}. Ces composants n'instancient leurs composants qu'à l'ouverture d'un PDF via la méthode \texttt{openPDF()}.
\item \texttt{MCQReaderMenu} : offre la barre de menu, il y est implémenté les fontions de sauvegarde, d'importation et d'analyse des fichiers modèles, et la fonction d'ouverture des PDF. Cependant, ces fonctions ne font en général qu'envoyer des messages vers les composants qui s'occupent du véritable traitement.
\item \texttt{MCQReaderTool} : contient les outils nécessaires pour la conception des fichiers modèles.
\item \texttt{MCQReaderButtons}: contient les boutons de l'interface pour la capture des différentes zones du fichier modèle ainsi que l'implémentation de leurs fonctionnalités.
\item \texttt{MCQReaderTree}: est une représentation graphique en forme d'arbre des éléments contenant le modèle. Il est construit à l'ouverture d'un PDF ou à l'importation d'un fichier modèle.
\item \texttt{MCQReaderInformation}: affiche les coordonnées de la souris lorsque celle-ci survole la surface du PDF. Ce composant peut être amélioré pour offrir plus d'informations à l'utilisateur et produire ainsi une meilleure ergonomie.
\item \texttt{MCQReaderPDF}: contient les composants nécessaires pour l'affichage des PDF et la sélection des différentes zones.
\item \texttt{MCQReaderNavigator}: permet pour l'instant de parcourir les pages des PDF. Ce composant peut être enrichi pour faciliter la manipulation des PDF (prise en main, zoom,etc.).
\item \texttt{MCQReaderGroup}: regroupe les différentes couches (calques) pour l'affichage des PDF ainsi que les sélections. Il crée les composants qu'il comporte à l'ouverture d'un fichier PDF. Pour bien comprendre son mécanisme, il est utile de voir la documentation de la classe dont il hérite \texttt{JLayeredPane}.
\item \texttt{MCQReaderDisplay}: s'occupe de l'affichage du PDF. Son mécanisme est expliqué dans la section suivante.
\item \texttt{MCQReaderSelection}: affiche les différentes zones sélectionnées de la page courante. Elle représente la deuxième représentation graphique du fichier modèle.
\item \texttt{MCQReaderLayer}: surface de sélection des zones. Pour la sélection des zones, il y a deux cas possibles mais les deux débutent de la même façon. Dès que l'utilisateur clique sur la surface du PDF, les coordonnées du clic sont enregistrées. Tant que la souris bouge et reste appuyé, un rectangle est sauvegardé et dessiné entre les coordonnées actuelles de la souris et ceux du clic enregistré. Au relâchement du clic, le rectangle enregistré reste affiché. Dans le cas où il s'agit de la sélection d'un radio ou de cases à cocher, le rectangle peut être enregistré à la question courante via le bouton "scale", puis à chaque clic de la souris sur la surface un rectangle de même taille est ajouté en tant que zone enregistré et affiché sur la page courante du PDF. Dans l'autre cas, il n'est pas nécessaire d'utiliser le bouton ``scale'', la validation est directement accessible pour enregistrer la zone.
\end{itemize}
\section{Rendu et affichage du PDF}
L'affichage des PDF est un besoin primaire pour le bon fonctionnement de l'interface. La recherche d'une bibliothèque d'extraction des PDF en langage Java a amené à utiliser la librairie PDFRenderer. Cette librairie propose un ensemble de fonctionnalités. La plus importante pour ce projet est l'extraction d'une image à partir d'un fichier PDF. L'extraction génère un objet implémentant l'interface \texttt{Image}. Elle se fait selon le numéro de page voulu du PDF. Cependant, la série des tests entrepris a montré que la librairie PDFRenderer n'ouvre qu'un certain type de PDF. Durant la phase des tests, il a été conclu que PDFRenderer n'ouvre que les PDF-1.4 dont la suite d'octets est stocké sous format Flate. En effet, lors de la mise en tampon du PDF, la librairie PDFRenderer utilise un filtre nommé FlateDecode. Dans le cas contraire, le PDF est mal affiché. De ce fait, la recherche d'une meilleur bibliothèque a été reprise. Finalement, la librairie PDFRenderer a été remplacé par la librairie JPedal. Celle-ci est une librairie gratuite à partir du moment où le logiciel qui l'utilise est sous licence LGPL. Elle s'utilise de la même façon que PDFRenderer tout ayant l'avantage de lire tous les types de PDF.
\section{Lancement de l'interface graphique}
Por executer le logiciel, il faut le lancer Java sur la classe \texttt{MCQReaderSystem}. Celle-c ise trouve dans le paquetage \texttt{MCQReaderSystem}. 
\begin{figure}[H]
\includegraphics[width=1\textwidth]{../images/MCQReaderSystem.jpg} 
\caption{Paquetage \texttt{MCQReaderSystem}}
\end{figure}
La classe \texttt{MCQReaderSystem} contient la méthode static main du programme. C'est elle qui instancie \texttt{MainInterface} pour ainsi créer toute l'interface graphique. Comme le montre la figure, \texttt{MCQReaderSystem} contient deux autres classes \texttt{Orienter} et \texttt{ImagePanel} dont le rôle sera expliqué dans la section suivante.
